package org.wheel.plugins.toolkit.util.sql.entity;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;


/**
 * <p>
 * 工作包
 * </p>
 *
 * @author lanjf2000
 * @since 2023-08-29
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WorkPackageBO implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String workMasterId;

    private WorkMasterBO workMasterBO;

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String taskCode;

    
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String milestone;

    private String workName;

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String workDescription;

    // 临时字段，用于后端查询json数据给前端进行名称拼接
    private String execDeptName;
    // 临时字段，add方法中，用于前端传递部门ID
    private String execDeptId;


    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String keyProject;

   
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String execUserId;
    // 执行人名称
    private String execUserName;


    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String responsibleDeptId;

    // 主责部门名称
    private String responsibleDeptName;
    // 主责部门对象

   
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String execType;

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String remark;

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private Integer sortNum;

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String finishStatus;

    // 临时字段，用于前端查询时，过滤掉终止的状态
    private List<String> excludeFinishStatus;


    // 临时字段，用于前端传递需要打的标记ID，领导督办，领导关注

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private String changeId;


    /**
     * 工作完成状态
     * 1. 未超期，工作按时结束（有时间结束时间，且结束时间等于计划结束时间）
     * 2. 延期，工作已经结束 （有时间结束时间，且结束时间晚于计划结束时间）
     * 3. 工作进行中。 （有实际开始时间，且当前时间小于计划结束时间）
     * 4. 任务未开始，也没有执行数据 （没有月度分解计划，也没有实际的时间）
     * 5. 任务提前结束 （依据实际完成时间判断）
     * 6. 任务终止或暂停 (判断 master主计划 或 package 工作包的 finish状态字段)
     * 7. 工作进行中，延误 （有实际开始时间，且当前时间大于等于计划结束时间）
     * 7(8). 工作进行中，延误（有实际开始时间，且实际开始时间 大于 计划结束时间）
     */
    private String workCompleteType;
    private Long workCompleteTypeCount;//临时字段，用来存状态下有多少个工作计划
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private Integer revision;


    // 临时字段
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<WorkPackageBO> afterWorkPackageBOList;
    // 临时字段
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<WorkPackageBO> beforeWorkPackageBOList;

    // 临时字段
    @JsonInclude(JsonInclude.Include.NON_EMPTY)

    // 临时字段，是否删除tag标签标记，用于标签取消功能
    private boolean deleteTag;

    // 前端按业务大类查询，为 /plan/work-package/list 接口提供大类查询
    private String workTypeCode;
    private String workTypeId;
    private String workSubtypeCode;
    private String workSubtypeId;
    private String workTypeName;//临时字段 业务类型名称
    // 工作包完成/未完成数据查询 null-查询全部，true-查询完成，false-查询未完成
    private Boolean workComplete;

    private String queryMonth;

    private String queryScoreMonth;

    private Integer queryYear;

    private LocalDateTime queryDay;

    // 首页是否显示已完成数据
    private boolean showFinishData;

    private BigDecimal totalMonthScore;

    private BigDecimal currentMonthScore;

    private String changeRequestStatus;

    /*
     * 用于工作变更审批分页列表标签查询条件。
     * 1-待审批状态：查询finishStatus状态值包含 5、延期申请；6、终止申请
     * 2-已审批状态：查询finishStatus状态值包含 1、已终止；4、已延期
     */
    private String changePageStatus;

    /*
     * 用于工作变更审批分页列表下拉查询条件。
     * 下拉查询条件：
     * 1- 延期变更类型。
     *   a. 待审核状态。查询finishStatus状态值等于 1、延期申请
     *   b. 已审核状态。查询finishStatus状态值等于 3、同意延期
     * 2- 终止变更类型。
     *   a. 待审核状态。查询finishStatus状态值等于 2、终止申请
     *   b. 已审核状态。查询finishStatus状态值等于 4、同意终止
     */
    private String changeSelectStatus;

    // 用于查询任务和内控类的多类型数据 listPackage查询接收参数字段
    private List<String> queryWorkTypeCodes;

    // 获取工作包日历数据的开始时间, 格式：yyyy-MM-dd
    private LocalDateTime startTime;
    // 获取工作包日历数据的结束时间, 格式：yyyy-MM-dd
    private LocalDateTime endTime;


    // 页面排序规则，前端传排序的页面值，后端进行针对性的排序。主要是针对 list 接口。传值参考：ProjectConst.PageOrderBy 类
    private Integer pageOrderBy;
    
    private LocalDateTime actualEndTime;
    
    
    //临时字段，根据计划开始时间范围查询
    private String startDate;
    private String endDate;

    private String monthCountName;//临时字段，首页中，工作统计页面用来判断是否分解的数据


    private String routineConfigId;
    
    
    private BigDecimal planNumber;//临时字段，生成销售任务时的销售量或生产量
    private String messageContentType;//临时字段，重点工作发送内容类型
    private List<String> excludeWorkSubtypeCodeList;

    // 月度工作计划分解对象集合
    private List<WorkPackageMonth> workPackageMonthBOList;
    /*
     * 临时字段，首页中是否显示预警,
     * 2024.02.06 新增需求：
     * 如果即将到达分解的计划完成时间，还没有完成的工作，在分解的图标上显示不同的背景色，在即将到达工作的计划完成时间，但还没有完成的工作，在工作列表中显示一个图标（炸弹图标），代表此工作即将延迟。
     * 如果当前系统时间+配置天数（字典表配置，比如3天）等于计划结束时间，那么package数据的showWarningFlag=1（新增字段）
     * 如果package中的showWarningFlag=1，显示示爆炸图标
     */
    private boolean showWarningFlag;
}
